package com.字符串;

public class Demo {

	public static void main(String[] args) {
		// 为字符串开辟一个字符串常量池，类似于缓存区
		// 创建字符串常量时，首先坚持字符串常量池是否存在该字符串
		// 存在该字符串，返回引用实例，不存在，实例化该字符串并放入池中
		String str1 = "hello";
		String str2 = "hello";
		System.out.println("str1 == str2：" + (str1 == str2)); // true

		// 通过new操作符创建的字符串对象不指向字符串池中的任何对象
		String str3 = new String("test");
		String str4 = new String("test");
		System.out.println("str3 == str4：" + (str3 == str4)); // false

		// 通过new操作符创建的字符串对象不指向字符串池中的任何对象，但是可以通过使用字符串的intern()方法来指向其中的某一个。
		// java.lang.String.intern()返回一个保留池字符串，就是一个在全局字符串池中有了一个入口。如果以前没有在全局字符串池中，那么它就会被添加到里面
		// Create three strings in three different ways.
		String s1 = "Hello";
		String s2 = new String("Hello");
		String s3 = s2.intern();
		// Determine which strings are equivalent using the ==
		// operator
		System.out.println("s1 == s2? " + (s1 == s2)); // false
		System.out.println("s1 == s3? " + (s1 == s3)); // true

		//会分配一个11长度的char数组，并在常量池分配一个由这个char数组组成的字符串，然后由m去引用这个字符串
		String m = "hello,world";
		//用n去引用常量池里边的字符串，所以和n引用的是同一个对象
        String n = "hello,world";
        //生成一个新的字符串对象，但内部的字符数组引用着m内部的字符数组
        String u = new String(m);
        //同样会生成一个新的字符串对象，但内部的字符数组引用常量池里边的字符串内部的字符数组，意思是和u是同样的字符数组
        String v = new String("hello,world");

        System.out.println(m == n); // true
        System.out.println(m == u); // false
        System.out.println(m == v); // false
        System.out.println(u == v); // false
	}
}
